/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "core/属性.h"
#include "UI/Widget.h"
#include "UI/ui绘制模板.h"
#include "UI/布局.h"


typedef void(*fp_滑块条更新)(C_Widget* self, float32 v);

class C_滚动条 : public C_Widget {
	float32*	m_映射位置;
	vec2		m_值区间;

public:
	C_滚动条(S_UI创建环境& ctx, E_方向 dir, C_Widget* 按钮[3] = 0);
	~C_滚动条();

	C_Widget*	m_滑块;

	E_方向		m_排列方向;
	bool		m_滑块自适应大小;
	float32		m_值;
	float32		m_值比例;
	fp_滑块条更新	mf_滑块滚动回调;
	
	

	float32		f_getValue();
	void		f_滚动滑块(float32 d);
	void		f_映射值指针(float32* v) { m_映射位置 = v; }
	void		f_set值范围(vec2 mm) { m_值区间 = mm; }

	float32		f_计算手柄长度();
	void		f_计算绑定的值(float32 比例);
	void		f_从绑定部件更新滑块();

};




struct S_双向滚动条 {
	
	S_双向滚动条(float32 厚度, C_Widget* 父部件, S_UI创建环境& ctx, C_Widget* 按钮[2] = 0);
	~S_双向滚动条();

	C_滚动条* m_V;
	C_滚动条* m_H;
	//E_方向		m_Dir;
	//vec2		m_值范围;
	//float32		m_值比例;
	//float32*	m_H映射最大值;
	//float32*	m_V映射最大值;
	//float32		m_当前值映射比例;

	float32		f_getHValue();
	float32		f_getVValue();
	void		f_滚动滑块(float32 d);
	void		f_绑定最大值(float32* h, float32* v);

};




/*class C_f32数值编辑框 : public C_Widget {
	float32* m_Value;
public:
	C_f32数值编辑框(float32* v);
	~C_f32数值编辑框();

	float32		f_getHValue();
	float32		f_getVValue();
	void		f_滚动滑块(float32 d);
	void		f_绑定最大值(float32* h, float32* v);

};*/


std::vector<uint16> f_draw_双向滚动条(C_Widget* 部件, S_2D画布* 画布, float32 厚度);







class C_Vec : public C_Widget {
	
public:
	C_Vec(E_方向 dir, S_Props& Value, S_UI创建环境& ctx);
	~C_Vec();

	S_Props		m_Value;
	E_方向		m_方向;

	uint16			m_draw属性ID;
	ui_绘制模板_Vec	m_draw;
	ui_绘制模板_行文本绘制		m_文本绘制;
	std::vector<std::wstring>	m_标签;

	void f_切换布局方向(E_方向 方向);

};







class C_多选框 : public C_Widget {

public:
	C_多选框(E_方向 dir, S_Props& Value, S_UI创建环境& ctx);
	~C_多选框();

	S_Props		m_Value;
	E_方向		m_方向;
	uint32    m_组排列元素数量;

	uint16			m_draw属性ID;
	ui_绘制模板_画预设图形	m_背景绘制;
	ui_绘制模板_行文本绘制	m_文本绘制;
	ui_绘制模板_图标		m_图标绘制;

	bool					m_是否绘制图标;
	bool					m_是否绘制标题;
	//void f_切换布局方向(E_方向 方向);
	void	f_绑定数据(S_Props& prop);

};




class C_curve编辑视口 : public C_Widget {

public:
	C_curve编辑视口(S_UI创建环境& ctx);
	~C_curve编辑视口();

	S_Props		m_Value;
	S_Array*	m_临时曲线数据;

	ui_绘制模板_画预设图形	m_点绘制;
	ui_绘制模板_曲线		m_曲线绘制;
	
	S_RGBA8UI	m_线颜色;
};

class C_曲线采样框 : public C_Widget {

public:
	C_曲线采样框(S_UI创建环境& ctx);
	~C_曲线采样框();
	//S_Props		m_Value;
	//uint16		m_draw属性ID;
	ui_绘制模板_画预设图形	m_背景绘制;
	ui_绘制模板_行文本绘制	m_文本绘制;
	ui_绘制模板_图标		m_图标绘制;

	
	S_Props		m_当前选中控制点;

	C_curve编辑视口*	ui曲线视口;
	C_Widget* ui当前选中控制点;

};




class C_多曲线编辑框 : public C_Widget {

public:
	C_多曲线编辑框(S_UI创建环境& ctx);
	~C_多曲线编辑框();

	ui_绘制模板_画预设图形	m_背景绘制;
	ui_绘制模板_行文本绘制	m_文本绘制;
	ui_绘制模板_图标		m_图标绘制;


	//S_Props		m_当前选中控制点;

	C_Widget* ui当前选中控制点;

};






struct S_Gpu曲线拾取计算 {
	S_GPU计算* m_GpuCtx;
	//S_板载缓存* m_相交数据;
	S_板载缓存* m_参数元素[3];
	uint8		m_布局位置[3];

	S_Gpu曲线拾取计算(S_设备环境& ctx);

	int32 f_run(S_板载缓存* 曲线控制点, vec2 拾取坐标, float32 最小距离);
};





